#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;

//函数模板
template <class T>
T add(T t1, T t2){
    return t1 + t2;
}

//在具体的调用时根据函数模板实例化出模板函数
//不需要显示定义这样的函数
/* short add(short t1,short t2){ */
/*     return t1 + t2; */
/* } */

void test0(){
    short s1 = 1, s2 = 2;
    int i1 = 3, i2 = 4;
    long l1 = 5, l2 = 6;
    double d1 = 1.8, d2 = 2.4;
    string str1("hello,");
    string str2("world!");
    //以下五次调用实际上实例化出了五个模板函数
    cout << add(s1,s2) << endl;
    cout << add(i1,i2) << endl;
    cout << add(l1,l2) << endl;
    cout << add(d1,d2) << endl;
    cout << add(str1,str2) << endl;

    cout << endl;
    //显式实例化，就是要求模板参数T实例化为指定的类型
    cout << add<int>(i1,i2) << endl;
    cout << add<int>(d1,d2) << endl;
}

int main(void){
    test0();
    return 0;
}
